package com.qqtech.qquan.circle.service;

import java.util.LinkedHashMap;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.qqtech.core.common.enums.YesNoEnum;
import com.qqtech.core.common.exception.BizzException;
import com.qqtech.core.frame.service.BaseService;
import com.qqtech.qquan.circle.enums.CircleFuncTypeDictEnum;
import com.qqtech.qquan.circle.model.CircleBase;
import com.qqtech.qquan.circle.model.CircleBaseQuery;
import com.qqtech.qquan.circle.model.CircleBaseVo;
import com.qqtech.qquan.circle.model.CircleMemberQuery;

public interface CircleBaseService extends BaseService<CircleBase> {
	/**
	 * 创建圈子(全功能)
	 * @param circleBase
	 * @param circleMember
	 * @return
	 */
	int addCircle(CircleBase circleBase) throws BizzException;
	
	/**
	 * 后台查询列表--分页
	 * 
	 * @param query
	 * @param pageable
	 * @return
	 */
	public Page<CircleBaseVo> queryPageListAdmin(CircleBaseQuery query, Pageable pageable);
	
	/**
	 * 创建圈子（只用于群聊）
	 * @param circleBase
	 * @return
	 * @throws BizzException
	 */
	int addCircle4Chat(CircleBase circleBase,List<Integer> memberIds) throws BizzException;
	
    /**
     * 判断用户是否是圈子创建者【是否圈主】
     *
     * @param userId
     * @param circleId
     * @return
     */
    boolean isCircleCreator(Integer userId, Integer circleId);
    
    /**
     * 查询我的圈子列表(我创建及我加入的)
     *
     * @param userId
     * @return
     */
    List<CircleBaseVo> queryMyCircles(CircleMemberQuery query);
    
    /**
     *  查询我的群聊列表(我创建及我加入的)
     * @param userId
     * @return
     */
    List<CircleBaseVo> queryMyGroupChats(int userId);
    
    
    /**
     * 查询我的圈子列表(我创建及我加入的)公开的
     *
     * @param userId
     * @return
     */
    List<CircleBaseVo> queryMyOpenCircles(int userId);

    /**
     * 查询我创建的圈子列表
     *
     * @param userId
     * @return
     */
    List<CircleBaseVo> queryMyCreatedCircles(int userId);
    
    /**
     * 查询我加入的圈子列表（不包括我创建的圈子）
     *
     * @param userId
     * @return
     */
    List<CircleBaseVo> queryMyJoinCircles(int userId);

    /**
     * 查询我管理的圈子列表（包括我创建的圈子）
     *
     * @param userId
     * @return
     */
    List<CircleBaseVo> queryMyManageCircles(int userId);
    
    /**
     * 删除圈子
     * @param circleId
     */
    void deleteCircle(Integer circleId);
    
    /**
     * 解散圈子
     * @param circleId
     */
    void dismissCircle(Integer circleId);

    /**
     * 根据圈子id列表查询圈子
     * @param circleIds
     * @return
     */
    List<CircleBaseVo> queryListByCircleIds(List<Integer> circleIds);
   
    /**
     * 我创建的圈子数量
     * @param userId
     * @return
     */
    int queryMyCreatedCircleCount(int userId);
    
    /**
     * 改变圈子功能类型
     * @param circleId
     * @param funcTypeEnum
     */
    void changeCircleFuncType(Integer circleId,CircleFuncTypeDictEnum funcTypeEnum);
    
    /**
     * 设置-是否-所有成员可以发布投票
     * @param circleId
     * @param isCanAddVote
     */
    void updateAllMemberCanAddVote(Integer circleId,YesNoEnum isCanAddVote);
    
    /**
     * 设置-是否-禁止所有成员可以发布活动
     * @param circleId
     * @param isCanAddActivity
     */
    void updateAllMemberCanAddActivity(Integer circleId,YesNoEnum isCanAddActivity);
    /**
     * 是否-禁止所有成员发布投票
     * @param circleId
     * @return
     */
    boolean isKeepAllMemberNoVote(Integer circleId);
    /**
     * 是否-禁止所有成员发布活动
     * @param circleId
     * @return
     */
    boolean isKeepAllMemberNoActivity(Integer circleId);
    
    /**
     * 推荐
     * @param circleId
     * @param isRecommend
     * @return
     * @throws BizzException
     */
    int setRecommend(Integer circleId, Integer recommendOidx) throws BizzException;
    
    /**
     * 取消推荐
     * @param circleId
     * @return
     * @throws BizzException
     */
    int setUnRecommend(Integer circleId) throws BizzException;
    
    /**
     * 显示-成员头衔
     * @param circleId
     * @return
     */
    int showMemberGrade(int circleId);
    /**
     * 不显示-成员头衔
     * @param circleId
     * @return
     */
    int hideMemberGrade(int circleId);

    /**
     * 审核通过
     * @param circleId
     */
    int auditPass(Integer circleId);
	/**
     * 审核不通过
     * @param circleId
     */
    int auditNotPass(Integer circleId);

    /**
     * 取消审核通过
     * 变更为：待审批
     * @param circleId
     * @return
     */
	int undoAudit(Integer circleId);

	/**
	 * 查询我的圈子列表(我创建及我加入的)-to map
	 * @param userId
	 * @return
	 */
	LinkedHashMap<Integer, CircleBaseVo> getMyCirclesMap(Integer userId);

	/**
	 * 查询推荐的圈子
	 * @param communityId 【社区id可为null】
	 * @param returnCount 【期望返回数量】
	 * @return
	 */
	List<CircleBaseVo> getRecommendCircleList(Integer communityId, int returnCount);

	/**
	 * 查询辐射一个社区的所有圈子
	 * @param communityId
	 * @return
	 */
	List<CircleBaseVo> getCircleList4Community(Integer communityId);

	/**
	 * 查询我的圈子列表(我创建及我加入的)【按发布话题的时间倒序】
	 * @param userId
	 * @return
	 */
	List<CircleBaseVo> queryMyOrderlyCircles(int userId);

}